#define _CRT_SECURE_NO_WARNINGS 1
//
//#include<iostream>
//
//using namespace std;
//
//bool is_pri(long long n)
//{
//	if (n < 2)
//		return false;
//	for (int i = 2; i <= sqrt(n); i++)
//		if (n % i == 0)
//			return false;
//	return true;
//}
//
//int main()
//{
//	int t;
//	cin >> t;
//	while(t--)
//	{
//		long long a, b;
//		cin >> a >> b;
//		if ((a == 1 && is_pri(b)) || (b==1&& is_pri(a)))
//			{
//				cout << "YES" << endl;
//			}
//		else
//		{
//			cout << "NO" << endl;
//		}
//	}
//
//	return 0;
//}

//
//#include<iostream>
//#include<vector>
//#include<algorithm>
//using namespace std;
//
//
//int main()
//{
//	int n,k;
//	cin >> n >> k;
//	vector<int> arr(n);
//	for (int i = 0; i < n; i++)
//		cin >> arr[i];
//
//	sort(arr.begin(), arr.end());
//
//	int ret = -1;
//	int l = 0, r = 0;
//	while (r < n)
//	{
//		if (arr[r] - arr[l] <= k)
//		{
//			ret = max(ret, r - l + 1);
//			r++;
//		}
//		else
//		{
//			l++;
//		}
//	}
//
//	cout << ret << endl;
//
//	return 0;
//}


#include<iostream>
#include<algorithm>
#include<string>

using namespace std;

int dp[1010][1010] = { 0 };

int main()
{
	string s1, s2;
	int n, m;
	cin >> n >> m;
	cin >> s1;
	cin >> s2;

	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			if (s1[i-1] == s2[j-1])
			{
				dp[i][j] = dp[i - 1][j - 1] + 1;
			}
			else
			{
				dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
			}
		}
	}

	cout << dp[n][m] << endl;

	return 0;
}